home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
mus
/
edit
/
amisox_wav.lha
/
avg.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
2KB
|
127 lines
/*
* July 5, 1991
* Copyright 1991 Lance Norskog And Sundry Contributors
* This source code is freely redistributable and may be used for
* any purpose. This copyright notice must be maintained.
* Lance Norskog And Sundry Contributors are not responsible for
* the consequences of using this software.
*/
/*
* Sound Tools stereo/quad -> mono mixdown effect file.
*
* Does not mix up to more channels.
*
* What's in a center channel?
*/
#include "st.h"
/*
* Process options
*/
avg_getopts(effp, n, argv)
eff_t effp;
int n;
char **argv;
{
if (n)
fail("Averaging effect takes no options.");
}
/*
* Start processing
*/
void
avg_start(effp)
eff_t effp;
{
switch (effp->outinfo.channels) {
case 1: switch (effp->ininfo.channels) {
case 2:
case 4:
return;
}
case 2: switch (effp->ininfo.channels) {
case 4:
return;
}
}
fail("Can't average %d channels into %d channels",
effp->ininfo.channels, effp->outinfo.channels);
}
/*
* Process either isamp or osamp samples, whichever is smaller.
*/
avg_flow(effp, ibuf, obuf, isamp, osamp)
eff_t effp;
long *ibuf, *obuf;
int *isamp, *osamp;
{
int len, done;
switch (effp->outinfo.channels) {
case 1: switch (effp->ininfo.channels) {
case 2:
len = ((*isamp/2 > *osamp) ? *osamp : *isamp/2);
for(done = 0; done < len; done++) {
*obuf++ = ibuf[0]/2 + ibuf[1]/2;
ibuf += 2;
}
*isamp = len * 2;
*osamp = len;
break;
case 4:
len = ((*isamp/4 > *osamp) ? *osamp : *isamp/4);
for(done = 0; done < len; done++) {
*obuf++ = ibuf[0]/4 + ibuf[1]/4 +
ibuf[2]/4 + ibuf[3]/4;
ibuf += 4;
}
*isamp = len * 4;
*osamp = len;
break;
}
break;
case 2: switch (effp->ininfo.channels) {
/*
* After careful inspection of CSOUND source code,
* I'm mildly sure the order is:
* front-left, front-right, rear-left, rear-right
*/
case 4:
len = ((*isamp/2 > *osamp) ? *osamp : *isamp/2);
len &= ~1;
for(done = 0; done < len; done++) {
obuf[0] = ibuf[0]/2 + ibuf[2]/2;
obuf[1] = ibuf[1]/2 + ibuf[3]/2;
ibuf += 4;
obuf += 2;
}
*isamp = len * 2;
*osamp = len;
break;
}
}
}
/*
* Do anything required when you stop reading samples.
* Don't close input file!
*
* Should have statistics on right, left, and output amplitudes.
*/
avg_stop(effp)
eff_t effp;
{
/* nothing to do */
}